package com.asj.utils;

import static android.content.ContentValues.TAG;

import static com.asj.enums.HttpRequestDictEnums.OL_http_ip;
import static com.asj.enums.HttpRequestDictEnums.local_http_ip;
import static com.asj.enums.HttpRequestDictEnums.request_interval_size;
import static com.asj.enums.HttpRequestDictEnums.request_max_size;
import static com.asj.enums.ResultCodeEnums.request_error;

import android.content.Context;
import android.util.Log;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import okhttp3.*;

import java.io.IOException;


/**
 * HTTP发送请求工具
 * */
public class HttpRequestUtils {

    /**
     * 向指定URL发送JSON格式的POST请求
     *
     * @param url    请求的URL地址
     * @param json   要发送的JSON字符串
     * @return        响应的字符串
     * @throws IOException 可能抛出的IO异常
     */
    public static String sendJsonPostRequest(String url, String json) throws IOException {
        OkHttpClient client = new OkHttpClient();
        // 创建请求体
        RequestBody requestBody = RequestBody.create(json, MediaType.get("application/json; charset=utf-8"));

        /* 补全请求IP地址 */
        url = local_http_ip.getValue()+url;
//        url = OL_http_ip.getValue()+url;

        // 创建请求
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();

        String result = "";
        try{
            Response response = client.newCall(request).execute();
            // 确保响应成功
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            // 返回响应的字符串
            assert response.body() != null;
            result =  response.body().string();
        }catch (Exception e){
            System.out.println("发送请求异常信息："+e.getMessage());
        }
        return result;
    }


    /**
     * 请求重试方法
     * @param url 请求路径
     * @param data 请求参数
     * @param expectedResultCode 预期结果code
     * @param context 活动服务
     * @param maxRetries 最大重试次数
     * */
    public static String retryHttpRequest(String url,
                                          String data,
                                          Integer expectedResultCode,
                                          Integer maxRetries,
                                          Context context){
        //设备存在结果
        String resultMsg = null;
        /* 1.设立计数器，最大重试次数，是否成功获取数据的标记 */
        int retryCount = 0; // 重试计数器
        int maxRetriesValue = Integer.parseInt(request_max_size.getValue());
        if(maxRetries != null){
            maxRetriesValue = maxRetries; // 最大重试次数
        }
        if(data == null){
            data = new JsonObject().toString();
        }

        boolean success = false; // 标记是否成功获取bind值


        /* 2.设立循环，重复请求，除非请求成功 或 直到最大重试次数停止 */
        while (!success && retryCount < maxRetriesValue) {
            try {
                resultMsg = sendJsonPostRequest(url, data);
                if(resultMsg != null && !resultMsg.isEmpty()){
                    //期望结果 需要后端返回Result格式，才能获取到数据
                    if(expectedResultCode !=null){
                        // 如果期待值与返回值不一致，则继续尝试重新请求
                        if(expectedResultCode == JsonParser.parseString(resultMsg).getAsJsonObject().get("code").getAsInt()){
                            success = true;
                        }else{
                            retryCount++; // 增加重试计数
                            // 可以选择在这里添加延时，避免立即重试
                            try {
                                Thread.sleep(Integer.parseInt(request_interval_size.getValue()));
                                System.out.println("请求发送异常！进行第："+retryCount+"次重试，地址："+url+"，参数："+data);
                                Log.e("请求发送异常！进行第："+retryCount+"次重试","url："+url+"，参数："+data);
                            } catch (InterruptedException ex) {
                                throw new RuntimeException(ex);
                            }
                        }
                    }else{
                        success = true; // 假设一旦成功获取返回值，就不再重试
                    }
                }else{
                    retryCount++; // 增加重试计数
                    // 可以选择在这里添加延时，避免立即重试
                    try {
                        Thread.sleep(Integer.parseInt(request_interval_size.getValue()));
                        System.out.println("请求发送异常！进行第："+retryCount+"次重试，地址："+url+"，参数："+data);
                        Log.e("请求发送异常！进行第："+retryCount+"次重试","url："+url+"，参数："+data);
                    } catch (InterruptedException ex) {
                        throw new RuntimeException(ex);
                    }
                }
            } catch (Exception e) {
                // 处理异常，例如打印日志
                Log.e(TAG, "重试请求机制异常！" + e.getMessage());
                //异常后立马将循环停止
                break;
            }
        }

        /* 3.到最后也没有请求成功，则放出提示 */
        if (!success) {
            if(context != null){
                //发布通知进行提示
                CommonsUtils.showNotification(context,"请求失败！","url:{"+url+"},data:{"+data+"},尝试请求次数："+maxRetriesValue);
            }
            Log.e("请求发送异常！","已达到最大重试次数，请求失败！");
            return request_error.getMessage();
        }
        return resultMsg;
    }

}
